#include "KoszykForm.h"
#include "MainWindowForm.h"
#include  <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <list>
#define DRIVER "QSQLITE"
#define DATABASE "./media.db"
#define HOST ""
#define USER ""
#define PASSWORD ""

#define FAKTURA 1
#define CD 2
#define PRZELEW 4
#define KURIER 16
#define POCZTA 32
#define FTP 64
#define POBRANIE 128


KoszykForm::KoszykForm(QWidget * parent,Uzytkownik *user):QDialog(parent)
{
	setupUi(this);
	connect(exitButton,SIGNAL(clicked()),this,SLOT(hide()));
	connect(removeButton,SIGNAL(clicked()),this,SLOT(usunProdukt()));
	connect(ftpRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(przelewRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(pocztaRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(fakturaCheckBox,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(cdRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(dvdRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(pobranieRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));
	connect(kurierRadioButton,SIGNAL(clicked()),this,SLOT(updateList()));

	connect(myProduktTableWidget,SIGNAL(cellClicked(int ,int)),this,SLOT(rowActivate(int,int)));
	connect(sendButton,SIGNAL(clicked()),this,SLOT(genZamowienie()));

	koszyk=new Koszyk;
	myProduktTableWidget->setRowCount(10);
	myProduktTableWidget->setColumnCount(3);
	readProducts();
	QStringList temps;
	temps<< "Nazwa" << "Rozmiar(MB) "<< "cena";
	myProduktTableWidget->setHorizontalHeaderLabels(temps);
	myProduktTableWidget->setColumnCount(3);

	//wyśiwietlenie danych klienta
	if(user) {
		zuser=dynamic_cast<Zarejestrowany *>(user);
		if (zuser){
				Dane dane=zuser->getDane();
				QString text=dane.getImie() +" " + dane.getNazwisko() +"\n" +dane.getUlica() + "\n" +dane.getKod()+", "+dane.getMiasto()+ "\ne-mail: "+dane.getEmail();
				daneLabel->setText(text);
		}
	}
}

void KoszykForm::readProducts(){

	Produkt *temp;
	QTableWidgetItem *item;
int i=0;
	myProduktTableWidget->setRowCount(koszyk->getListaProduktow().size());


for (produktList::iterator it=koszyk->getListaProduktow().begin();it!=(koszyk->getListaProduktow().end());++it){
		(*it)->getRozmiar();
		temp=(*it);

		item=myProduktTableWidget->item(i,0);
		if (item) item->setText(QString::fromStdString(temp->getNazwa()));
		else myProduktTableWidget->setItem(i,0,item=new QTableWidgetItem(QString::fromStdString(temp->getNazwa())));
		item->setData(Qt::UserRole,QVariant(temp->getId()));	//zapisanie pod nazwą dodatkowego adtrybutu (identyfikatora)


		item=myProduktTableWidget->item(i,1);
		if (item) item->setText(QString::number(temp->getRozmiar()));
		else myProduktTableWidget->setItem(i,1,item=new QTableWidgetItem(QString::number(temp->getRozmiar())));

		item=myProduktTableWidget->item(i,2);
		if (item) item->setText(QString::number(temp->getCena()));
		else myProduktTableWidget->setItem(i,2,item=new QTableWidgetItem(QString::number(temp->getCena())));
			
		i++;
}
}
void KoszykForm::usunProdukt(){
	QList<QTableWidgetItem *> selected=myProduktTableWidget->selectedItems();
	QList<QTableWidgetItem *>::iterator it=selected.begin();
	if (it!=selected.end()){
			int row=(*it)->row();
		koszyk->getListaProduktow().removeAt(row);
		readProducts();
	}	
	
}
void KoszykForm::updateList(){
/****Uaktualnianie rozmiar/cenalabel****/
		int rows=myProduktTableWidget->rowCount();
		double rozmiar=0;
		double cena=0;
		QTableWidgetItem *item;
		for (int i=0;i<rows;i++) {
				item=myProduktTableWidget->item(i,1);
				if (item) rozmiar+=item->text().toDouble();
				item=myProduktTableWidget->item(i,2);
				if (item) cena+=item->text().toDouble();
		}

		if (fakturaCheckBox->isChecked()) cena+=5.0;
		if (pocztaRadioButton->isChecked()) cena+=10;
		if (kurierRadioButton->isChecked()) cena+=15;
		
		if (cdRadioButton->isChecked()) cena+=(double)((int)(rozmiar/700.0))+1.0;
		if (dvdRadioButton->isChecked()) cena+=(double)((int)(rozmiar/(4.7*1024.0)))+1.0;
		if (przelewRadioButton->isChecked()) cena-=5.0;


		rozmiarLabel->setText(QString::number(rozmiar));
		cenaLabel->setText(QString::number(cena));
	

	
readProducts();
}


void KoszykForm::setKoszyk(Koszyk *kosz){
	koszyk=kosz;
}

Koszyk *KoszykForm::getKoszyk(){
		return koszyk;
}

void KoszykForm::rowActivate(int row,int column){
	QList<QTableWidgetItem *> selected=myProduktTableWidget->selectedItems();
	for (QList<QTableWidgetItem *>::iterator it=selected.begin();it!=selected.end();it++){
		if(row==(*it)->row())	continue; 
		(*it)->setSelected(false);
	}

	QTableWidgetItem *item;
	for (int i=0;i<myProduktTableWidget->columnCount();i++) {
		item=myProduktTableWidget->item(row,i);
		if(item) item->setSelected(true);	
	}
}

void KoszykForm::genZamowienie(){
		//dodać wpis do tabeli zamowienia
 	QSqlDatabase db = QSqlDatabase::addDatabase( DRIVER );
    	db.setDatabaseName( DATABASE );
	    db.setUserName( USER );
	    db.setPassword( PASSWORD );
	    db.setHostName( HOST );

	if 	(!db.open()) {printf("Nie udało się otworzyć bazy danych");
			return ;
	}
	else printf("Połączono się z bazą\n");

	QSqlQuery query;
	int flaga=0;

	if (cdRadioButton->isChecked()) flaga+=CD;
	if (fakturaCheckBox->isChecked()) flaga+=FAKTURA;
	if (ftpRadioButton->isChecked()) flaga+=FTP;
	if (przelewRadioButton->isChecked()) flaga+=PRZELEW;
	if (pocztaRadioButton->isChecked()) flaga+=POCZTA;
	if (pobranieRadioButton->isChecked()) flaga+=POBRANIE;

	
	query.prepare("INSERT INTO zamowienia (nrk,flaga,wartosc) values (:nrk, :flaga, :wartosc)");
		query.bindValue(":nrk",zuser->getDane().getId());
		query.bindValue(":flaga",flaga);
		query.bindValue(":wartosc",cenaLabel->text().toDouble());
	query.exec();


	

	//pobranie numeru zamówienia, czyli ostatniego najwyższego indexu
	query.exec("Select max(nrz) from zamowienia");
	query.first();
	int nrz=query.value(0).toInt();

	for (produktList::iterator it=koszyk->getListaProduktow().begin();it!=koszyk->getListaProduktow().end();it++){
	query.exec("Insert into kupione (nrz,nrp,nrk) values (:nrz, :nrp, :nrk)");
		query.bindValue(":nrz",nrz);
		query.bindValue(":nrp",QString::number((*it)->getId()));
		query.bindValue(":nrk",zuser->getDane().getId());
	query.exec();
	}
	db.close();
	this->close();
}
